package com.nowar.common.util.thread;

import lombok.Getter;
import lombok.Setter;

import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 工厂模式
 *
 * @Author: 谢无殇。
 * @Date : 2023-06-04 22:03
 */
@Setter
@Getter
public class SimpleThreadFactory implements ThreadFactory {

    private String suffix = "::";
    private ThreadGroup threadGroup;
    private Thread.UncaughtExceptionHandler handler;
    private AtomicInteger atomicInteger = new AtomicInteger(1);
    private String name;

    public SimpleThreadFactory(String name, Thread.UncaughtExceptionHandler handler) {
        SecurityManager securityManager = System.getSecurityManager();
        this.threadGroup = securityManager != null ? securityManager.getThreadGroup() : Thread.currentThread().getThreadGroup();
        this.name = name + suffix;
        this.handler = handler;
    }


    @Override
    public Thread newThread(Runnable runnable) {
        Thread thread = new Thread(this.threadGroup, runnable, this.name + this.atomicInteger.getAndIncrement(), 0L);

        // 该线程是否为守护线程
        // 用户线程：Java虚拟机在它所有非守护线程已经离开后自动离开。
        // 守护线程：守护线程则是用来服务用户线程的，如果没有其他用户线程在运行，
        // 那么就没有可服务对象，也就没有理由继续下去。
        if (thread.isDaemon()) {
            thread.setDaemon(false);
        }
        //getPriority()方法用于检查线程的优先级。 当创建一个线程时，它会为它分配一些优先级。
        // 程的优先级可以由JVM或程序员在创建线程时明确指定。
        //线程的优先级在1到10的范围内。线程的默认优先级为5
        if (thread.getPriority() != 5) {
            thread.setPriority(5);
        }

        //子线程异常捕获处理
        if (this.handler != null) {
            thread.setUncaughtExceptionHandler(this.handler);
        }
        return thread;
    }
}
